#!/usr/bin/env ruby
require 'mkmf'

# This list is checked in reverse order, so this order allows mkmf on my Mac
# to find BDB installed via Homebrew (/usr/local) before system installs
%w[/usr / /usr/local /usr/local/db* /usr/local/BerkeleyDB*].each do |pdir|
	Dir[pdir].each do |dir|
		dir_config('db', "#{dir}/include", "#{dir}/lib")
	end
end

# MacPorts installs the directories "inside-out" compared to the structure expected above
macports_db_versions = Dir["/opt/local/include/db*"].map { |dir| /\d\d$/.match(dir)[0] }
macports_db_versions.each do |version|
  dir_config('db', "/opt/local/include/db#{version}", "/opt/local/lib/db#{version}")
end

%w(db-5.1 db-5.0 db-4.9 db-4.8 db-4.7 db-4.6 db-4.5 db-4.4 db-4.3 db-4.2).each do |ver|
	have_library ver, 'db_version', 'db.h'
end

def create_header
  if File.exist?("bdb_aux._c")
    message("Not writing bdb_aux._c (defines), already exists\n")
    return
  end
  
  message("Writing bdb_aux._c (defines), this takes a while\n")

  db_header = $CPPFLAGS.split.select { |f| f =~ /^-I/ }.map { |e| 
    f = File.join(e[2..-1], 'db.h')
    File.exists?(f) ? f : nil
  }.select { |e| e }.first

  n=0
  defines=[]
  File.open(db_header) {|fd|
    File.open("bdb_aux._c","w") {|hd|
      hd.puts("/* This file automatically generated by extconf.rb */\n")
      fd.each_line {|l|
        if l =~ %r{^#define\s+(DBC?_\w*)\s+([^\/]*)\s*(.*?)(\/\*.*)?$}
          name = $1
          value = $2
          if macro_defined?(name,"#include <db.h>")
            case value
            when /^"/
              hd.print(%Q{cs(mBdb,%s);\n}%[name])
            when /^\(?(0x|\d)/
              hd.print(%Q{cu(mBdb,%s);\n}%[name])
            when /^\(?-/
              hd.print(%Q{ci(mBdb,%s);\n}%[name])
            else
              $stderr.puts "don't know how to handle #{name} #{value.strip}, guessing UINT"
              hd.print(%Q{cu(mBdb,%s);\n}%[name])
            end
            n+=1
          end
        end
      }
    }
    message("\nwrote #{n} defines\n")
  }
end

create_header
create_makefile('bdb')
